/**
 * Markdown 转 HTML 工具
 * @description 将 Markdown 格式文本转换为 HTML，用于 rich-text 组件渲染
 */

/**
 * 转义 HTML 特殊字符
 * @param {string} text - 需要转义的文本
 * @returns {string} 转义后的文本
 */
function escapeHtml(text) {
  if (!text) return ''
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  }
  return text.replace(/[&<>"']/g, m => map[m])
}

/**
 * 将 Markdown 文本转换为 HTML
 * @param {string} markdown - Markdown 格式的文本
 * @returns {string} HTML 格式的文本
 */
function markdownToHtml(markdown) {
  if (!markdown) return ''

  let html = markdown

  // 先转义所有 HTML 特殊字符，防止被误认为标签
  // 但要保留我们即将添加的 Markdown 标记
  const codeBlocks = []
  const inlineCodes = []

  // 1. 提取并保护代码块 (```)
  html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, (match, lang, code) => {
    const placeholder = `___CODE_BLOCK_${codeBlocks.length}___`
    codeBlocks.push({
      lang: lang || 'code',
      code: escapeHtml(code.trim())
    })
    return placeholder
  })

  // 2. 提取并保护行内代码 (`)
  html = html.replace(/`([^`]+)`/g, (match, code) => {
    const placeholder = `___INLINE_CODE_${inlineCodes.length}___`
    inlineCodes.push(escapeHtml(code))
    return placeholder
  })

  // 3. 转义剩余的 HTML 特殊字符
  html = escapeHtml(html)

  // 4. 标题处理 (# ## ### ...)
  // 注意：\s* 表示可以有0个或多个空格，支持 ###Title 和 ### Title 两种格式
  html = html.replace(/^######\s*(.+)$/gim, '<h6>$1</h6>')
  html = html.replace(/^#####\s*(.+)$/gim, '<h5>$1</h5>')
  html = html.replace(/^####\s*(.+)$/gim, '<h4>$1</h4>')
  html = html.replace(/^###\s*(.+)$/gim, '<h3>$1</h3>')
  html = html.replace(/^##\s*(.+)$/gim, '<h2>$1</h2>')
  html = html.replace(/^#\s*(.+)$/gim, '<h1>$1</h1>')

  // 5. 粗体处理 (**text**)
  html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')

  // 6. 删除线处理 (~~text~~)
  html = html.replace(/~~(.+?)~~/g, '<del>$1</del>')

  // 7. 无序列表处理 (- item)，支持缩进
  html = html.replace(/^(\s*)[-*+]\s*(.+)$/gm, (match, spaces, content) => {
    const indent = spaces.length > 0 ? `padding-left: ${20 + spaces.length * 10}rpx;` : 'padding-left: 20rpx;'
    return `<div style="${indent} margin: 4rpx 0;">• ${content}</div>`
  })

  // 8. 有序列表处理 (1. item)，支持缩进
  html = html.replace(/^(\s*)(\d+)\.\s*(.+)$/gm, (match, spaces, num, content) => {
    const indent = spaces.length > 0 ? `padding-left: ${20 + spaces.length * 10}rpx;` : 'padding-left: 20rpx;'
    return `<div style="${indent} margin: 4rpx 0;">${num}. ${content}</div>`
  })

  // 9. 引用处理 (> text)
  html = html.replace(/^&gt;\s*(.+)$/gim, '<div style="border-left: 4rpx solid #667eea; padding-left: 16rpx; margin: 8rpx 0; color: #666; font-style: italic;">$1</div>')

  // 10. 分隔线处理 (---)
  html = html.replace(/^---+$/gm, '<div style="border-top: 2rpx solid #e9ecef; margin: 16rpx 0;"></div>')

  // 11. 换行处理
  html = html.replace(/\n\n/g, '</p><p>')
  html = html.replace(/\n/g, '<br/>')

  // 12. 恢复代码块
  codeBlocks.forEach((block, index) => {
    const placeholder = `___CODE_BLOCK_${index}___`
    html = html.replace(placeholder, `<pre><code>${block.code}</code></pre>`)
  })

  // 13. 恢复行内代码
  inlineCodes.forEach((code, index) => {
    const placeholder = `___INLINE_CODE_${index}___`
    html = html.replace(placeholder, `<code>${code}</code>`)
  })

  // 14. 包裹段落
  if (!html.startsWith('<')) {
    html = `<p>${html}</p>`
  }

  return html
}

/**
 * 为 rich-text 组件生成带样式的 HTML
 * @param {string} markdown - Markdown 格式的文本
 * @returns {string} 带内联样式的 HTML
 */
function markdownToRichText(markdown) {
  let html = markdownToHtml(markdown)

  // 添加内联样式
  const styles = {
    p: 'margin: 0 0 16rpx 0; line-height: 1.6; color: #333; font-size: 28rpx;',
    h1: 'font-size: 42rpx; font-weight: 600; margin: 24rpx 0 12rpx 0; color: #333;',
    h2: 'font-size: 40rpx; font-weight: 600; margin: 20rpx 0 10rpx 0; color: #333;',
    h3: 'font-size: 38rpx; font-weight: 600; margin: 20rpx 0 10rpx 0; color: #333;',
    h4: 'font-size: 36rpx; font-weight: 600; margin: 16rpx 0 8rpx 0; color: #333;',
    h5: 'font-size: 34rpx; font-weight: 600; margin: 16rpx 0 8rpx 0; color: #333;',
    h6: 'font-size: 32rpx; font-weight: 600; margin: 16rpx 0 8rpx 0; color: #333;',
    strong: 'font-weight: 600; color: #333;',
    em: 'font-style: italic; color: #666;',
    del: 'text-decoration: line-through; color: #999;',
    code: 'background-color: #f5f5f5; padding: 4rpx 8rpx; border-radius: 6rpx; font-family: Consolas, Monaco, monospace; font-size: 26rpx; color: #e83e8c;',
    pre: 'background-color: #f6f8fa; padding: 20rpx; border-radius: 8rpx; overflow-x: auto; margin: 16rpx 0;',
    blockquote: 'border-left: 4rpx solid #667eea; padding-left: 16rpx; margin: 8rpx 0; color: #666; font-style: italic;',
    ul: 'margin: 16rpx 0; padding-left: 32rpx;',
    ol: 'margin: 16rpx 0; padding-left: 32rpx;',
    li: 'margin: 4rpx 0; line-height: 1.6; color: #333; font-size: 28rpx;',
    a: 'color: #667eea; text-decoration: underline;',
    hr: 'border: none; border-top: 2rpx solid #e9ecef; margin: 16rpx 0;',
    img: 'max-width: 100%; height: auto; border-radius: 8rpx; margin: 16rpx 0;',
    br: 'display: block; margin: 8rpx 0; content: "";'
  }

  // 应用样式
  Object.keys(styles).forEach(tag => {
    const regex = new RegExp(`<${tag}([^>]*)>`, 'g')
    html = html.replace(regex, `<${tag} style="${styles[tag]}"$1>`)
  })

  return html
}

/**
 * 整理 AI 输出的交易分析报告
 * 处理完全没有格式的文本，将其转换为结构化的 Markdown
 * @param {string} rawText - 原始的 AI 输出文本
 * @returns {string} 整理后的 Markdown 格式文本
 */
function formatTradingAnalysis(rawText) {
  if (!rawText) return ''

  let text = rawText.trim()

  // 1. 处理分隔线 ---
  text = text.replace(/---/g, '\n\n')

  // 2. 处理标题（从长到短，避免重复替换）
  text = text.replace(/####/g, '\n\n### ')
  text = text.replace(/###/g, '\n\n## ')

  // 3. 处理列表项
  // 3.1 处理 -** 模式（粗体列表项）
  // 匹配：数字或）后面的 -**
  text = text.replace(/([\d）])-\*\*/g, '$1\n- **')
  // 匹配：非数字后面的 -**（但要排除数字范围中的 -）
  text = text.replace(/([^\d\n])-\*\*/g, '$1\n- **')

  // 3.2 处理 -中文 模式（普通列表项，如 -支撑1、-若价格）
  // 确保 - 后面跟着中文字符
  text = text.replace(/([^\d\n])-([\u4e00-\u9fa5])/g, '$1\n- $2')

  // 4. 处理数字列表（1. 2. 3.）
  text = text.replace(/(\d+)\.\s*\*\*/g, '\n- **')

  // 5. 处理句号后的粗体（表示新段落）
  text = text.replace(/。\*\*/g, '。\n\n**')

  // 6. 处理引用（注：）
  text = text.replace(/（注：/g, '\n\n> 注：')
  text = text.replace(/。）/g, '。')

  // 7. 清理多余的空行
  text = text.replace(/\n{3,}/g, '\n\n')

  // 8. 清理开头和结尾的空行
  text = text.trim()

  return text
}

// 导出（CommonJS 格式，uni-app 会自动转换为 ES6）
module.exports = {
  markdownToHtml,
  markdownToRichText,
  formatTradingAnalysis
}
